Sub CopiarObjetosYReemplazarTextoDesdeCSV()

    Dim rutaArchivo As String
    Dim listaColumnas As Collection
    Dim listaTextos As Collection
    Set listaColumnas = New Collection
    
    rutaArchivo = "C:\Macro.csv"
    
    Dim archivo As Integer
    archivo = FreeFile
    
    On Error GoTo ErrorHandler
    Open rutaArchivo For Input As archivo
    
    Dim textoActual As String
    Dim valores As Variant
    Dim i As Integer
    
    ' Leer CSV
    Do While Not EOF(archivo)
        Line Input #archivo, textoActual
        valores = Split(textoActual, ";")
        
        For i = LBound(valores) To UBound(valores)
            If listaColumnas.Count < (i + 1) Then
                Set listaTextos = New Collection
                listaColumnas.Add listaTextos
            End If
            listaColumnas(i + 1).Add valores(i)
        Next i
    Loop
    
    Close archivo

    If ActiveSelection.Shapes.Count = 0 Then
        MsgBox "Selecciona objetos."
        Exit Sub
    End If

    Dim alturaSeleccion As Double
    alturaSeleccion = ActiveSelection.SizeHeight
    
    Dim desplazamientoY As Double
    desplazamientoY = alturaSeleccion

    Dim objetoOriginal As Shape
    Dim copia As Shape
    Dim j As Integer
    Dim colIndex As Integer
    Dim encontrado As Boolean
    Dim textoObjeto As String

    For Each objetoOriginal In ActiveSelection.Shapes
        
        If objetoOriginal.Type = cdrTextShape Then
            
            textoObjeto = Trim(objetoOriginal.Text.Story.Text)
            encontrado = False
            
            '  Buscar columna correcta comparando con el primer valor
            For colIndex = 1 To listaColumnas.Count
                
                If Trim(listaColumnas(colIndex)(1)) = textoObjeto Then
                    
                    Set listaTextos = listaColumnas(colIndex)
                    encontrado = True
                    
                    '  ORIGINAL = primer valor
                    objetoOriginal.Text.Story.Text = listaTextos(1)
                    
                    '  COPIAS
                    For j = 2 To listaTextos.Count
                        Set copia = objetoOriginal.Duplicate
                        
                        copia.Text.Story.Text = listaTextos(j)
                        
                        copia.SetPosition objetoOriginal.PositionX, _
                            objetoOriginal.PositionY + ((j - 1) * desplazamientoY)
                    Next j
                    
                    Exit For
                End If
                
            Next colIndex
            
            '  Si no encuentra coincidencia
            If Not encontrado Then
                MsgBox "No se encontró coincidencia para: " & textoObjeto
            End If
        
        Else
            ' Objetos no texto → usar cantidad de filas de la primera columna
            If listaColumnas.Count > 0 Then
                
                For j = 2 To listaColumnas(1).Count
                    Set copia = objetoOriginal.Duplicate
                    
                    copia.SetPosition objetoOriginal.PositionX, _
                        objetoOriginal.PositionY + ((j - 1) * desplazamientoY)
                Next j
                
            End If
        End If
        
    Next objetoOriginal

    MsgBox "Proceso completado correctamente."
    Exit Sub

ErrorHandler:
    MsgBox "Error al leer el CSV."
    Close archivo

End Sub